const crypto = require('node:crypto')

//对称加密算法
//双方协商定义一个密钥以及iv
// 第一个参数 algorithm 接受一个算法 常用aes-256-cbc
// 第二个参数 key, 也就是密钥  32位
// 第三个参数 iv, 初始化向量 支持16位, 保证我们生成的密钥串每次是不一样的。密钥如果缺少位数，还可以帮助补码
let key = crypto.randomBytes(32)
let iv = Buffer.from(crypto.randomBytes(16))
const cipher = crypto.createCipheriv("aes-256-cbc", key, iv)

cipher.update('小满zs', 'utf-8', 'hex')
const result = cipher.final('hex') //得到16进制的密文
console.log(result)

//解密 需要使用相同的算法, 相同的eky, 相同的iv
const de = crypto.createDecipheriv('aes-256-cbc', key, iv)
de.update(result, "hex", "utf-8")
console.log(de.final("utf-8"))


//非对称加密算法
//生成公钥和私钥
//私钥只能是管理员拥有的，不能对外公开
//公钥可以对外公开

const {privateKey, publicKey} = crypto.generateKeyPairSync('rsa', {
    modulusLength: 2048 // 长度越长越安全，速度越慢
})
// 使用公钥加密
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from('小米su7'))
console.log(encrypted.toString('hex'))
// 使用私钥解密
const decrypted = crypto.privateDecrypt(privateKey, encrypted)
console.log(decrypted.toString())


//哈希函数
//单向不可逆，不能被解密
//使用场景1：密码存数据库
//但不是很安全，具有唯一性，可撞库破解（所以需要设置复杂密码，特殊符号+大小写字母+数字）
//使用场景2：校验文件一致性
//跟前端md5匹配，如果一致，文件则没问题
let hash = crypto.createHash('sha256')
// let hash = crypto.createHash('md5')
hash.update('小米yu7')
console.log(hash.digest('hex'))